/**
 * 消息处理工具函数集
 * 
 * 本模块提供了处理聊天消息、时间格式化以及数据结构转换的通用工具函数。
 * 主要用于 MainConsole 组件与后端数据交互时的数据适配和格式化。
 */

import type { Message } from '../api'

/**
 * 格式化日期时间字符串
 * 
 * 将 ISO 格式的时间字符串（或兼容格式）转换为 "YYYY-MM-DD HH:mm" 格式。
 * 如果输入无效或转换失败，则原样返回输入字符串。
 * 
 * @param dateString - 待格式化的时间字符串（如 "2023-11-24T12:34:56Z"）
 * @returns 格式化后的时间字符串（如 "2023-11-24 12:34"）
 */
export const formatDateTime = (dateString: string): string => {
  if (!dateString) return ''
  
  const date = new Date(dateString)
  
  // 检查日期对象是否有效
  if (isNaN(date.getTime())) {
    console.error('时间格式化失败: 无效的日期字符串', dateString)
    return dateString
  }

  const year = date.getFullYear()
  // 月份从0开始，需要+1，并补齐两位
  const month = String(date.getMonth() + 1).padStart(2, '0')
  const day = String(date.getDate()).padStart(2, '0')
  const hours = String(date.getHours()).padStart(2, '0')
  const minutes = String(date.getMinutes()).padStart(2, '0')
  
  return `${year}-${month}-${day} ${hours}:${minutes}`
}

/**
 * 将后端返回的 screen1 数据结构转换为前端使用的 Message 数组
 * 
 * 后端返回的数据结构较为复杂，包含用户消息、思考过程（thinkBegin/thinkOver）、
 * 智能体输出以及普通 AI 回复。此函数负责将其扁平化并转换为前端组件可渲染的格式。
 * 
 * 处理逻辑：
 * 1. 识别用户消息 (role='user')
 * 2. 识别思考块的开始与结束 (css='thinkBegin'/'thinkOver')
 * 3. 提取智能体输出并归并到思考块中
 * 4. 识别普通 AI 回复和总结消息
 * 
 * @param screen1 - 后端返回的消息数组（源数据）
 * @returns 转换后的 Message 数组，供组件渲染使用
 */
export const convertScreen1ToMessages = (screen1: any[]): Message[] => {
  const messages: Message[] = []
  // 当前正在处理的思考消息对象，用于收集连续的智能体输出
  let currentThinkingMessage: any = null
  // 标记是否处于思考块内部
  let isInThinkingBlock = false

  if (!Array.isArray(screen1)) {
    return messages
  }

  screen1.forEach((item: any) => {
    // Case 1: 用户消息
    if (item.role === 'user' && item.content) {
      messages.push({
        type: 'user',
        content: item.content,
        time: new Date().toLocaleString('zh-CN')
      })
    }
    // Case 2: 思考块开始标记
    else if (item.css === 'thinkBegin') {
      isInThinkingBlock = true
      // 初始化一个新的思考消息对象
      currentThinkingMessage = {
        type: 'thinking',
        status: 'thinking', // 初始状态为思考中
        sections: [],       // 存储各个智能体的输出节点
        time: new Date().toLocaleString('zh-CN')
      }
    }
    // Case 3: 思考块结束标记
    else if (item.css === 'thinkOver') {
      if (currentThinkingMessage) {
        // 标记思考过程完成
        currentThinkingMessage.status = 'completed'
        messages.push(currentThinkingMessage)
        currentThinkingMessage = null
      }
      isInThinkingBlock = false
    }
    // Case 4: 智能体消息处理
    // 检测格式: {"智能体名称": {"role": "assistant", "content": "..."}}
    // 这里支持动态键名，不局限于特定的智能体名称
    else if (typeof item === 'object' && !item.role && !item.css) {
      // 获取对象的第一个键作为智能体名称
      const agentKey = Object.keys(item)[0]
      if (agentKey) {
        const agentData = item[agentKey]

        // 验证数据格式：必须包含 role='assistant' 和 content 字段
        if (agentData && typeof agentData === 'object' && agentData.role === 'assistant' && agentData.content) {
          const { content } = agentData

          // 只有在思考块内部时，才将智能体内容添加到思考消息中
          if (isInThinkingBlock && currentThinkingMessage) {
            currentThinkingMessage.sections.push({
              agentName: agentKey,
              content: content,  // 原始内容，后续可能需要 Markdown 渲染
              collapsed: true,   // 默认折叠
              showIcon: true     // 显示完成图标
            })
          }
        }
      }
    }
    // Case 5: 普通 Assistant 消息 (非思考过程中的回复)
    else if (item.role === 'assistant') {
      const { type, css, content } = item

      // 追问或普通回答
      if (type === 'ask' && content) {
        messages.push({
          type: 'ai',
          content: content,
          time: new Date().toLocaleString('zh-CN'),
          isStreaming: false
        })
      }
      // 总结性消息 (带有 summary 样式)
      else if (css === 'summary' && content) {
        messages.push({
          type: 'ai',
          content: content,
          time: new Date().toLocaleString('zh-CN'),
          isStreaming: false,
          isSummary: true // 标记为总结消息，可能会有特殊的 UI 样式
        })
      }
    }
  })

  // 边界情况处理：如果遍历结束仍有未闭合的思考块，强制将其添加并关闭
  if (currentThinkingMessage) {
    currentThinkingMessage.status = 'completed'
    messages.push(currentThinkingMessage)
  }

  return messages
}